Analisis Fundamental dan Teknikal Saham PT Industri Jamu dan Farmasi Sido Muncul Tbk (SIDO)¶

PT Industri Jamu dan Farmasi Sido Muncul Tbk, yang dikenal dengan ticker SIDO, adalah salah satu perusahaan terkemuka di Indonesia dalam industri jamu, farmasi, dan minuman kesehatan. Dalam analisis ini, kita akan melakukan dua jenis analisis utama untuk memahami kinerja saham SIDO.

Analisis Fundamental¶

Analisis fundamental melibatkan pemeriksaan mendalam terhadap laporan keuangan perusahaan untuk menentukan nilai intrinsik saham. Dalam bagian ini, kita akan menganalisis berbagai aspek seperti:

  • Laporan Keuangan: Neraca, laporan laba rugi, dan arus kas.
  • Rasio Keuangan: Return on Equity (ROE), Debt-to-Equity (DE), dan lainnya.
  • Kinerja Operasional: Pertumbuhan pendapatan, laba bersih, dan efisiensi operasional.
  • Faktor Eksternal: Kondisi ekonomi makro, regulasi pemerintah, dan faktor industri yang dapat mempengaruhi kinerja perusahaan.

Tujuan dari analisis fundamental adalah untuk menentukan apakah saham SIDO saat ini undervalued atau overvalued dibandingkan dengan nilai intrinsiknya.

Analisis Teknikal¶

Analisis teknikal menggunakan data historis harga dan volume perdagangan untuk mengidentifikasi pola dan tren yang dapat digunakan untuk memprediksi pergerakan harga saham di masa depan. Dalam bagian ini, kita akan menggunakan berbagai indikator teknikal seperti:

  • Moving Averages: Simple Moving Average (SMA) 50 hari dan 200 hari.
  • Relative Strength Index (RSI): Untuk mengukur kekuatan relatif pergerakan harga terbaru.
  • Moving Average Convergence Divergence (MACD): Untuk mengidentifikasi perubahan arah tren.
  • dan indikator lainnya.

Tujuan dari analisis teknikal adalah untuk menentukan titik masuk dan keluar yang optimal untuk perdagangan saham berdasarkan pola dan tren yang teridentifikasi.

Langkah-langkah Analisis¶

  1. Pengambilan Data: Mengunduh data historis saham SIDO dari sumber terpercaya seperti Yahoo Finance.
  2. Visualisasi Data: Membuat grafik harga penutupan saham dan indikator teknikal.
  3. Analisis Fundamental: Menghitung rasio keuangan dan menganalisis laporan keuangan.
  4. Analisis Teknikal: Menggunakan indikator teknikal untuk mengidentifikasi pola dan tren.

Dengan pendekatan ini, diharapkan dapat memberikan wawasan yang komprehensif tentang kinerja saham SIDO dan memprediksi pergerakan harganya di masa depan.

In [1]:
# Import Library
from datetime import timedelta
from matplotlib import gridspec
from plotly.subplots import make_subplots
import numpy as np
import pandas as pd
import datetime as dt
import matplotlib.pyplot as plt
import matplotlib.pylab
import seaborn as sns
import plotly.express as px
import plotly.graph_objects as go
import warnings
warnings.filterwarnings('ignore')
In [2]:
# Import yfinance
import yfinance as yf
In [3]:
# Load Data SIDO
ticker = 'SIDO.JK'
company = yf.Ticker(ticker)

Fundamental Analysis¶

Income Statement¶

In [4]:
# Menampilkan data Income Statement SIDO
income_statement = company.financials
income_statement
Out[4]:
2023-12-31 2022-12-31 2021-12-31 2020-12-31 2019-12-31
Tax Effect Of Unusual Items 295009965.240964 144046394.976378 54818921.158842 59545852.271022 NaN
Tax Rate For Calcs 0.220486 0.221951 0.218402 0.22136 NaN
Normalized EBITDA 1228212000000.0 1426341000000.0 1620230000000.0 1207774000000.0 NaN
Total Unusual Items 1338000000.0 649000000.0 251000000.0 269000000.0 NaN
Total Unusual Items Excluding Goodwill 1338000000.0 649000000.0 251000000.0 269000000.0 NaN
Net Income From Continuing Operation Net Minority Interest 950648000000.0 1104714000000.0 1260898000000.0 934016000000.0 NaN
Reconciled Depreciation 9469000000.0 6496000000.0 6511000000.0 8080000000.0 NaN
Reconciled Cost Of Revenue 1547235000000.0 1696832000000.0 1734948000000.0 1496628000000.0 NaN
EBITDA 1229550000000.0 1426990000000.0 1620481000000.0 1208043000000.0 NaN
EBIT 1220081000000.0 1420494000000.0 1613970000000.0 1199963000000.0 NaN
Net Interest Income 28668000000.0 26786000000.0 36539000000.0 48517000000.0 NaN
Interest Expense 542000000.0 642000000.0 739000000.0 415000000.0 NaN
Interest Income 29349000000.0 27566000000.0 37401000000.0 49045000000.0 NaN
Normalized Income 949605009965.240967 1104209046394.976318 1260701818921.158936 933806545852.270996 NaN
Net Income From Continuing And Discontinued Operation 950648000000.0 1104714000000.0 1260898000000.0 934016000000.0 NaN
Total Expenses 2357990000000.0 2490765000000.0 2460542000000.0 2191955000000.0 NaN
Rent Expense Supplemental 3935000000.0 3052000000.0 3124000000.0 4394000000.0 NaN
Total Operating Income As Reported 1190871000000.0 1393066000000.0 1576692000000.0 1151025000000.0 NaN
Diluted Average Shares 30000000000.0 30000000000.0 29825671066.0 29768471800.0 NaN
Basic Average Shares 30000000000.0 30000000000.0 29825671066.0 29768471800.0 NaN
Diluted EPS 31.69 36.82 42.28 31.38 NaN
Basic EPS 31.69 36.82 42.28 31.38 NaN
Diluted NI Availto Com Stockholders 950648000000.0 1104714000000.0 1260898000000.0 934016000000.0 NaN
Net Income Common Stockholders 950648000000.0 1104714000000.0 1260898000000.0 934016000000.0 NaN
Otherunder Preferred Stock Dividend 0.0 0.0 0.0 0.0 NaN
Net Income 950648000000.0 1104714000000.0 1260898000000.0 934016000000.0 NaN
Minority Interests 0.0 0.0 0.0 0.0 NaN
Net Income Including Noncontrolling Interests 950648000000.0 1104714000000.0 1260898000000.0 934016000000.0 NaN
Net Income Continuous Operations 950648000000.0 1104714000000.0 1260898000000.0 934016000000.0 NaN
Tax Provision 268891000000.0 315138000000.0 352333000000.0 265532000000.0 NaN
Pretax Income 1219539000000.0 1419852000000.0 1613231000000.0 1199548000000.0 NaN
Other Non Operating Income Expenses 24433000000.0 8490000000.0 20761000000.0 8535000000.0 NaN
Special Income Charges 1338000000.0 649000000.0 251000000.0 269000000.0 NaN
Other Special Charges -1338000000.0 -649000000.0 -251000000.0 -269000000.0 NaN
Write Off NaN NaN 53000000.0 2338000000.0 0.0
Net Non Operating Interest Income Expense 28668000000.0 26786000000.0 36539000000.0 48517000000.0 NaN
Total Other Finance Cost 139000000.0 138000000.0 123000000.0 113000000.0 NaN
Interest Expense Non Operating 542000000.0 642000000.0 739000000.0 415000000.0 NaN
Interest Income Non Operating 29349000000.0 27566000000.0 37401000000.0 49045000000.0 NaN
Operating Income 1207940000000.0 1374758000000.0 1560438000000.0 1143456000000.0 NaN
Operating Expense 810755000000.0 793933000000.0 725594000000.0 695327000000.0 NaN
Other Operating Expenses 35771000000.0 -55000000.0 -410000000.0 2338000000.0 NaN
Depreciation And Amortization In Income Statement 9469000000.0 6496000000.0 6511000000.0 8080000000.0 NaN
Depreciation Income Statement 9469000000.0 6496000000.0 6511000000.0 8080000000.0 NaN
Selling General And Administration 511243000000.0 521506000000.0 499556000000.0 474717000000.0 NaN
Selling And Marketing Expense 478127000000.0 482995000000.0 475476000000.0 427022000000.0 NaN
General And Administrative Expense 33116000000.0 38511000000.0 24080000000.0 47695000000.0 NaN
Rent And Landing Fees 3935000000.0 3052000000.0 3124000000.0 4394000000.0 NaN
Gross Profit 2018695000000.0 2168691000000.0 2286032000000.0 1838783000000.0 NaN
Cost Of Revenue 1547235000000.0 1696832000000.0 1734948000000.0 1496628000000.0 NaN
Total Revenue 3565930000000.0 3865523000000.0 4020980000000.0 3335411000000.0 NaN
Operating Revenue 3565930000000.0 3865523000000.0 4020980000000.0 3335411000000.0 NaN
In [5]:
# Transpose data Income Statement
ic_transposed = income_statement.T
ic_transposed
Out[5]:
Tax Effect Of Unusual Items Tax Rate For Calcs Normalized EBITDA Total Unusual Items Total Unusual Items Excluding Goodwill Net Income From Continuing Operation Net Minority Interest Reconciled Depreciation Reconciled Cost Of Revenue EBITDA EBIT ... Depreciation And Amortization In Income Statement Depreciation Income Statement Selling General And Administration Selling And Marketing Expense General And Administrative Expense Rent And Landing Fees Gross Profit Cost Of Revenue Total Revenue Operating Revenue
2023-12-31 295009965.240964 0.220486 1228212000000.0 1338000000.0 1338000000.0 950648000000.0 9469000000.0 1547235000000.0 1229550000000.0 1220081000000.0 ... 9469000000.0 9469000000.0 511243000000.0 478127000000.0 33116000000.0 3935000000.0 2018695000000.0 1547235000000.0 3565930000000.0 3565930000000.0
2022-12-31 144046394.976378 0.221951 1426341000000.0 649000000.0 649000000.0 1104714000000.0 6496000000.0 1696832000000.0 1426990000000.0 1420494000000.0 ... 6496000000.0 6496000000.0 521506000000.0 482995000000.0 38511000000.0 3052000000.0 2168691000000.0 1696832000000.0 3865523000000.0 3865523000000.0
2021-12-31 54818921.158842 0.218402 1620230000000.0 251000000.0 251000000.0 1260898000000.0 6511000000.0 1734948000000.0 1620481000000.0 1613970000000.0 ... 6511000000.0 6511000000.0 499556000000.0 475476000000.0 24080000000.0 3124000000.0 2286032000000.0 1734948000000.0 4020980000000.0 4020980000000.0
2020-12-31 59545852.271022 0.22136 1207774000000.0 269000000.0 269000000.0 934016000000.0 8080000000.0 1496628000000.0 1208043000000.0 1199963000000.0 ... 8080000000.0 8080000000.0 474717000000.0 427022000000.0 47695000000.0 4394000000.0 1838783000000.0 1496628000000.0 3335411000000.0 3335411000000.0
2019-12-31 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN

5 rows × 52 columns

In [6]:
# Mengonversi dari satuan dasar ke miliar
ic_convert = ic_transposed[["Net Income", "Gross Profit", "Operating Income", "Total Revenue", "Cost Of Revenue"]] / 1e9
ic_convert
Out[6]:
Net Income Gross Profit Operating Income Total Revenue Cost Of Revenue
2023-12-31 950.648 2018.695 1207.94 3565.93 1547.235
2022-12-31 1104.714 2168.691 1374.758 3865.523 1696.832
2021-12-31 1260.898 2286.032 1560.438 4020.98 1734.948
2020-12-31 934.016 1838.783 1143.456 3335.411 1496.628
2019-12-31 NaN NaN NaN NaN NaN
In [7]:
# Menghapus data kosong
ic_cleaned = ic_convert.dropna(how='all')
ic_cleaned
Out[7]:
Net Income Gross Profit Operating Income Total Revenue Cost Of Revenue
2023-12-31 950.648 2018.695 1207.94 3565.93 1547.235
2022-12-31 1104.714 2168.691 1374.758 3865.523 1696.832
2021-12-31 1260.898 2286.032 1560.438 4020.98 1734.948
2020-12-31 934.016 1838.783 1143.456 3335.411 1496.628
In [8]:
# Menghitung Gross Profit Margin
gpm = ic_cleaned["Gross Profit"] / ic_cleaned["Total Revenue"] * 100
gpm
Out[8]:
2023-12-31    56.610618
2022-12-31     56.10343
2021-12-31    56.852608
2020-12-31    55.129128
dtype: object
In [9]:
# Menghitung Operating Profit Margin
opm = ic_cleaned["Operating Income"]  / ic_cleaned["Total Revenue"] * 100
opm
Out[9]:
2023-12-31    33.874473
2022-12-31    35.564605
2021-12-31    38.807405
2020-12-31    34.282312
dtype: object
In [10]:
# Menghitung Net Profit Margin
npm = ic_cleaned["Net Income"]  / ic_cleaned["Total Revenue"] * 100
npm
Out[10]:
2023-12-31    26.659188
2022-12-31    28.578643
2021-12-31    31.357977
2020-12-31    28.003026
dtype: object
In [11]:
# Visualisasi Income Statement
from plotly.subplots import make_subplots

# Set dua y axis
fig = make_subplots(specs=[[{"secondary_y": True}]])

# Bar chart Total Revenue
fig.add_trace(
    go.Bar(x=ic_cleaned.index,
        y=ic_cleaned["Total Revenue"],
        name = 'Total Revenue',
        hovertemplate = None
    ), secondary_y=False)

# Bar chart Net Income
fig.add_trace(
    go.Bar(x=ic_cleaned.index,
        y=ic_cleaned["Net Income"],
        name = 'Net Income',
        hovertemplate = None
    ), secondary_y=False)


# Line chart Profit Margin
fig.add_trace(
    go.Scatter(x=ic_cleaned.index, y=npm,
        name = 'Profit Margin (%)',
        hovertemplate = None
    ), secondary_y=True)


# Update layout menambahkan judul
fig.update_layout(
    title=dict(
        text="Income Statement SIDO",
        x=0.5,
        y=0.9,
        font=dict(size=18)
    ), hovermode="x unified"
)

# Update axis
fig.update_yaxes(title_text="IDR", secondary_y=False, ticksuffix='B', hoverformat = "d")
fig.update_yaxes(title_text="(%)", secondary_y=True, hoverformat = ".2f")
fig.update_xaxes(
    tickmode='array',
    tickvals=[f'{year}-12-31' for year in range(2020, 2024)],
    ticktext=[str(year) for year in range(2020, 2024)]
)

Analisis dan Interpretasi

  • Pendapatan total menunjukkan peningkatan dari 2020 hingga 2021, namun menurun hingga 2023. Pada tahun 2020, pendapatan total sekitar 3,3 triliun IDR. Tahun 2021, pendapatan total meningkat menjadi sekitar 4 triliun IDR. Pada tahun 2023, pendapatan total turun sekitar 3,6 triliun IDR atau turun 7,75% dibandingkan pendapatan pada tahun sebelumnya sebesar Rp 3,86 triliun.

  • Pendapatan bersih mengikuti pola yang mirip dengan pendapatan total, dengan peningkatan pada tahun 2021 dan penurunan setelahnya. Tahun 2020, pendapatan bersih sekitar 934 miliar IDR. Tahun 2021, pendapatan bersih mencapai puncaknya sekitar 1,3 triliun IDR. Pada tahun 2023, pendapatan bersih turun sekitar 950 miliar IDR atau turun 13,95% dari tahun sebelumnya sekitar 1,10 triliun. Hal ini menunjukkan bahwa profitabilitas SIDO mengalami fluktuasi selama periode tersebut.

  • Profit margin meningkat tajam dari 2020 hingga 2021, namun menurun hingga 2023. Pada tahun 2020, profit margin sekitar 28%. Tahun 2021, profit margin mencapai puncaknya sekitar 31%. Pada tahun 2023, profit margin turun sekitar 26%. Penurunan profit margin setelah 2021 menunjukkan bahwa meskipun pendapatan bersih dan total pendapatan relatif stabil, efisiensi operasional atau manajemen biaya SIDO mengalami penurunan.

Secara keseluruhan, grafik income statement menunjukkan fluktuasi dalam pendapatan total dan pendapatan bersih SIDO dari tahun 2020 hingga 2023. Meskipun ada peningkatan yang signifikan pada 2021, terjadi penurunan kembali pada periode berikutnya. Terjadinya penurunan pada tahun 2023 dikarenakan lemahnya daya beli masyarakat khususnya pada kuartal 3 sehingga berdampak terhadap penjualan produk-produk Sido Muncul.

Balance Sheet¶

In [12]:
# Menampilkan Balance Sheet SIDO
balance_sheet = company.balance_sheet
balance_sheet
Out[12]:
2023-12-31 2022-12-31 2021-12-31 2020-12-31 2019-12-31
Treasury Shares Number NaN NaN 4514471.0 231532326.0 233043777.0
Ordinary Shares Number 30000000000.0 30000000000.0 29995485529.0 29997487673.0 NaN
Share Issued 30000000000.0 30000000000.0 30000000000.0 30229019999.0 NaN
Total Debt 9391000000.0 2385000000.0 8670000000.0 7190000000.0 NaN
Tangible Book Value 3257849000000.0 3376177000000.0 3341067000000.0 3089755000000.0 NaN
... ... ... ... ... ...
Gross Accounts Receivable 821392000000.0 686722000000.0 667191000000.0 669040000000.0 NaN
Cash Cash Equivalents And Short Term Investments 830128000000.0 923047000000.0 1082219000000.0 1031954000000.0 NaN
Cash And Cash Equivalents 830128000000.0 923047000000.0 1082219000000.0 1031954000000.0 NaN
Cash Equivalents 580861000000.0 720982000000.0 845862000000.0 658331000000.0 NaN
Cash Financial 249267000000.0 202065000000.0 236357000000.0 373623000000.0 NaN

70 rows × 5 columns

In [13]:
# Transpose data Balance Sheet
bs_transposed = balance_sheet.T
bs_transposed
Out[13]:
Treasury Shares Number Ordinary Shares Number Share Issued Total Debt Tangible Book Value Invested Capital Working Capital Net Tangible Assets Capital Lease Obligations Common Stock Equity ... Raw Materials Other Receivables Taxes Receivable Accounts Receivable Allowance For Doubtful Accounts Receivable Gross Accounts Receivable Cash Cash Equivalents And Short Term Investments Cash And Cash Equivalents Cash Equivalents Cash Financial
2023-12-31 NaN 30000000000.0 30000000000.0 9391000000.0 3257849000000.0 3385934000000.0 1604791000000.0 3257849000000.0 9391000000.0 3385934000000.0 ... 282350000000.0 1806000000.0 NaN 788722000000.0 -32670000000.0 821392000000.0 830128000000.0 830128000000.0 580861000000.0 249267000000.0
2022-12-31 NaN 30000000000.0 30000000000.0 2385000000.0 3376177000000.0 3505468000000.0 1653194000000.0 3376177000000.0 2385000000.0 3505468000000.0 ... 371828000000.0 2042000000.0 NaN 686662000000.0 -60000000.0 686722000000.0 923047000000.0 923047000000.0 720982000000.0 202065000000.0
2021-12-31 4514471.0 29995485529.0 30000000000.0 8670000000.0 3341067000000.0 3471178000000.0 1701337000000.0 3341067000000.0 8670000000.0 3471178000000.0 ... 327471000000.0 3032000000.0 NaN 664058000000.0 -3133000000.0 667191000000.0 1082219000000.0 1082219000000.0 845862000000.0 236357000000.0
2020-12-31 231532326.0 29997487673.0 30229019999.0 7190000000.0 3089755000000.0 3221733000000.0 1492038000000.0 3089755000000.0 7190000000.0 3221733000000.0 ... 222111000000.0 3890000000.0 NaN 663757000000.0 -5283000000.0 669040000000.0 1031954000000.0 1031954000000.0 658331000000.0 373623000000.0
2019-12-31 233043777.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN 3544000000.0 NaN NaN NaN NaN NaN NaN NaN

5 rows × 70 columns

In [14]:
# Mengonversi dari satuan dasar ke miliar
bs_convert = bs_transposed[["Total Assets", "Total Liabilities Net Minority Interest", "Total Equity Gross Minority Interest"]] / 1e9
bs_convert
Out[14]:
Total Assets Total Liabilities Net Minority Interest Total Equity Gross Minority Interest
2023-12-31 3890.706 504.765 3385.941
2022-12-31 4081.442 575.967 3505.475
2021-12-31 4068.97 597.785 3471.185
2020-12-31 3849.516 627.776 3221.74
2019-12-31 NaN NaN NaN
In [15]:
# Menghapus data kosong
bs_cleaned = bs_convert.dropna(how='all')
bs_cleaned
Out[15]:
Total Assets Total Liabilities Net Minority Interest Total Equity Gross Minority Interest
2023-12-31 3890.706 504.765 3385.941
2022-12-31 4081.442 575.967 3505.475
2021-12-31 4068.97 597.785 3471.185
2020-12-31 3849.516 627.776 3221.74
In [16]:
# Menghitung rasio solvabilitas Debt on Equity Ratio (DER)
DER = bs_cleaned["Total Liabilities Net Minority Interest"] / bs_cleaned["Total Equity Gross Minority Interest"] *100
DER
Out[16]:
2023-12-31    14.907673
2022-12-31    16.430498
2021-12-31    17.221352
2020-12-31     19.48562
dtype: object
In [17]:
# Menghitung rasio solvabilitas Debt on Assets Ratio (DAR)
DAR = bs_cleaned["Total Liabilities Net Minority Interest"] / bs_cleaned["Total Assets"] *100
DAR
Out[17]:
2023-12-31    12.973609
2022-12-31    14.111851
2021-12-31     14.69131
2020-12-31     16.30792
dtype: object
In [18]:
# Visualisasi Balance Sheet
from plotly.subplots import make_subplots

# Set dua y axis
fig = make_subplots(specs=[[{"secondary_y": True}]])

# Bar chart Total Assets
fig.add_trace(
    go.Bar(x=bs_cleaned.index,
        y=bs_cleaned["Total Assets"],
        name = 'Total Assets',
        hovertemplate = None
    ), secondary_y=False)

# Bar chart Total Liabilities
fig.add_trace(
    go.Bar(x=bs_cleaned.index,
        y=bs_cleaned["Total Liabilities Net Minority Interest"],
        name = 'Total Liability',
        hovertemplate = None
    ), secondary_y=False)

# Bar chart Total Equity
fig.add_trace(
    go.Bar(x=bs_cleaned.index,
        y=bs_cleaned["Total Equity Gross Minority Interest"],
        name = 'Total Equity',
        hovertemplate = None
    ), secondary_y=False)

# Line chart Debt on Equity Ratio
fig.add_trace(
    go.Scatter(x=bs_cleaned.index, y=DER,
        name = 'DER (%)',
        hovertemplate = None
    ), secondary_y=True)


# Update layout menambahkan judul
fig.update_layout(
    title=dict(
        text="Balance Sheet SIDO",
        x=0.5,
        y=0.9,
        font=dict(size=18)
    ), hovermode="x unified"
)

# Update axis
fig.update_yaxes(title_text="IDR", ticksuffix='B', secondary_y=False, hoverformat = "d")
fig.update_yaxes(title_text="(%)", secondary_y=True, hoverformat = ".2f")
fig.update_xaxes(
    tickmode='array',
    tickvals=[f'{year}-12-31' for year in range(2020, 2024)],
    ticktext=[str(year) for year in range(2020, 2024)]
)

Analysis dan Interpretasi

  • Aset total SIDO cenderung stabil, berada di sekitar 3,8 triliun hingga 4 triliun IDR sepanjang periode. Stabilitas ini menunjukkan bahwa SIDO berhasil menjaga nilai asetnya secara konsisten selama periode ini.

  • Kewajiban total menunjukkan penurunan yang signifikan dari tahun 2020 hingga 2023. Pada tahun 2020, kewajiban total sekitar 628 miliar IDR. Pada tahun 2021 hingga 2023, kewajiban total menurun hingga mendekati 500 miliar IDR. Penurunan ini menunjukkan bahwa SIDO berhasil mengurangi kewajiban atau utangnya secara signifikan.

  • Ekuitas total menunjukkan peningkatan dari tahun 2020 hingga 2023. Pada tahun 2020, ekuitas total sekitar 3,2 triliun IDR. Pada tahun 2021 hingga 2023, ekuitas total meningkat mendekati 3,5 triliun IDR. Peningkatan ini mencerminkan bahwa nilai ekuitas pemegang saham dalam perusahaan bertambah seiring dengan pengurangan kewajiban dan stabilitas aset.

  • Debt to Equity Ratio (DER) menunjukkan penurunan yang konsisten dari tahun 2020 hingga 2023. Pada tahun 2020, DER sekitar 19%. Pada tahun 2023, DER turun menjadi sekitar 14,9%. Penurunan DER menunjukkan bahwa SIDO mengurangi proporsi utang terhadap ekuitasnya, yang menandakan perbaikan dalam struktur modal dan pengurangan risiko finansial.

Secara keseluruhan, grafik balance sheet SIDO menunjukkan bahwa SIDO telah mengalami peningkatan yang signifikan dalam hal stabilitas keuangan. Penurunan kewajiban total dan DER, serta peningkatan ekuitas total, menunjukkan bahwa perusahaan berhasil mengurangi utangnya secara signifikan dan meningkatkan nilai bagi pemegang saham. Stabilitas aset total menunjukkan manajemen aset yang baik, sementara penurunan kewajiban menunjukkan bahwa SIDO telah mengambil langkah-langkah untuk mengurangi risiko finansial dan meningkatkan stabilitas jangka panjang.

Cash Flow¶

In [19]:
# Menampilkan cashflow SIDO
cash_flow = company.cashflow
cash_flow
Out[19]:
2023-12-31 2022-12-31 2021-12-31 2020-12-31
Free Cash Flow 1005007000000.0 928734000000.0 1076764000000.0 940615000000.0
Issuance Of Capital Stock 0.0 4055000000.0 6988000000.0 1264000000.0
Capital Expenditure -50387000000.0 -178403000000.0 -122553000000.0 -95139000000.0
End Cash Position 830128000000.0 923047000000.0 1082219000000.0 1031954000000.0
Beginning Cash Position 923047000000.0 1082219000000.0 1031954000000.0 864824000000.0
Effect Of Exchange Rate Changes -27055000000.0 1543000000.0 446000000.0 1402000000.0
Changes In Cash -65864000000.0 -160715000000.0 49819000000.0 165728000000.0
Financing Cash Flow -1074265000000.0 -1088230000000.0 -1025193000000.0 -774907000000.0
Net Other Financing Charges NaN NaN -7664000000.0 NaN
Cash Dividends Paid -1068000000000.0 -1086000000000.0 -1018142000000.0 -773988000000.0
Common Stock Dividend Paid -1068000000000.0 -1086000000000.0 -1018142000000.0 -773988000000.0
Net Common Stock Issuance 0.0 4055000000.0 6988000000.0 1264000000.0
Common Stock Issuance 0.0 4055000000.0 6988000000.0 1264000000.0
Investing Cash Flow -46993000000.0 -179622000000.0 -124305000000.0 -95119000000.0
Net Other Investing Changes -348000000.0 -1905000000.0 -2657000000.0 -1134000000.0
Net PPE Purchase And Sale -46645000000.0 -177717000000.0 -121648000000.0 -93985000000.0
Sale Of PPE 3742000000.0 686000000.0 905000000.0 1154000000.0
Purchase Of PPE -50387000000.0 -178403000000.0 -122553000000.0 -95139000000.0
Cash Flowsfromusedin Operating Activities Direct 1055394000000.0 1107137000000.0 1199317000000.0 1035754000000.0
Taxes Refund Paid Direct -270119000000.0 -336341000000.0 -315523000000.0 -244347000000.0
Interest Received Direct 29370000000.0 27562000000.0 37630000000.0 51002000000.0
Interest Paid Direct -681000000.0 -780000000.0 -862000000.0 -522000000.0
Classesof Cash Payments -2152241000000.0 -2434103000000.0 -2546401000000.0 -1990817000000.0
Other Cash Paymentsfrom Operating Activities -568884000000.0 -519651000000.0 -502481000000.0 -443850000000.0
Paymentson Behalfof Employees -449325000000.0 -447271000000.0 -441328000000.0 -368210000000.0
Paymentsto Suppliersfor Goodsand Services -1134032000000.0 -1467181000000.0 -1602592000000.0 -1178757000000.0
Classesof Cash Receiptsfrom Operating Activities 3449065000000.0 3850799000000.0 4024473000000.0 3220438000000.0
Receiptsfrom Customers 3449065000000.0 3850799000000.0 4024473000000.0 3220438000000.0
In [20]:
# Transpose data Cash Flow
cf_transposed = cash_flow.T
cf_transposed
Out[20]:
Free Cash Flow Issuance Of Capital Stock Capital Expenditure End Cash Position Beginning Cash Position Effect Of Exchange Rate Changes Changes In Cash Financing Cash Flow Net Other Financing Charges Cash Dividends Paid ... Cash Flowsfromusedin Operating Activities Direct Taxes Refund Paid Direct Interest Received Direct Interest Paid Direct Classesof Cash Payments Other Cash Paymentsfrom Operating Activities Paymentson Behalfof Employees Paymentsto Suppliersfor Goodsand Services Classesof Cash Receiptsfrom Operating Activities Receiptsfrom Customers
2023-12-31 1005007000000.0 0.0 -50387000000.0 830128000000.0 923047000000.0 -27055000000.0 -65864000000.0 -1074265000000.0 NaN -1068000000000.0 ... 1055394000000.0 -270119000000.0 29370000000.0 -681000000.0 -2152241000000.0 -568884000000.0 -449325000000.0 -1134032000000.0 3449065000000.0 3449065000000.0
2022-12-31 928734000000.0 4055000000.0 -178403000000.0 923047000000.0 1082219000000.0 1543000000.0 -160715000000.0 -1088230000000.0 NaN -1086000000000.0 ... 1107137000000.0 -336341000000.0 27562000000.0 -780000000.0 -2434103000000.0 -519651000000.0 -447271000000.0 -1467181000000.0 3850799000000.0 3850799000000.0
2021-12-31 1076764000000.0 6988000000.0 -122553000000.0 1082219000000.0 1031954000000.0 446000000.0 49819000000.0 -1025193000000.0 -7664000000.0 -1018142000000.0 ... 1199317000000.0 -315523000000.0 37630000000.0 -862000000.0 -2546401000000.0 -502481000000.0 -441328000000.0 -1602592000000.0 4024473000000.0 4024473000000.0
2020-12-31 940615000000.0 1264000000.0 -95139000000.0 1031954000000.0 864824000000.0 1402000000.0 165728000000.0 -774907000000.0 NaN -773988000000.0 ... 1035754000000.0 -244347000000.0 51002000000.0 -522000000.0 -1990817000000.0 -443850000000.0 -368210000000.0 -1178757000000.0 3220438000000.0 3220438000000.0

4 rows × 28 columns

In [21]:
# Mengonversi dari satuan dasar ke miliar
cf_convert = cf_transposed[["Cash Flowsfromusedin Operating Activities Direct", "Investing Cash Flow", "Financing Cash Flow"]] / 1e9
cf_convert
Out[21]:
Cash Flowsfromusedin Operating Activities Direct Investing Cash Flow Financing Cash Flow
2023-12-31 1055.394 -46.993 -1074.265
2022-12-31 1107.137 -179.622 -1088.23
2021-12-31 1199.317 -124.305 -1025.193
2020-12-31 1035.754 -95.119 -774.907
In [22]:
# Visualisasi Cash Flow
fig = go.Figure()

# Bar chart Operating Cash Flow
cf1  = go.Bar(
        x=cf_convert.index,
        y=cf_convert["Cash Flowsfromusedin Operating Activities Direct"],
        name = 'Operating',
        hovertemplate = None
    )

# Bar chart Investing Cash Flow
cf2  = go.Bar(
        x=cf_convert.index,
        y=cf_convert["Investing Cash Flow"],
        name = 'Investing',
        hovertemplate = None
    )

# Bar chart Financing Cash Flow
cf3  = go.Bar(
        x=cf_convert.index,
        y=cf_convert["Financing Cash Flow"],
        name = 'Financing',
        hovertemplate = None
    )

# Set data visualisasi Cash Flow
data_cf = [cf1, cf2, cf3]

# Update layout menambahkan judul
layout = go.Layout({
    'title': {
        'text': 'Cash Flow SIDO',
        'font': {
            'size': 20
        },
        'x': 0.5,
        'xanchor': 'center'
    },
},
hovermode="x unified"
)

# Update axis
fig = go.Figure(data=data_cf, layout=layout)
fig.update_yaxes(title_text="IDR", ticksuffix='B', hoverformat = "d")
fig.update_xaxes(
    tickmode='array',
    tickvals=[f'{year}-12-31' for year in range(2020, 2024)],
    ticktext=[str(year) for year in range(2020, 2024)]
)

Analysis dan Interpretasi

  • Selama periode 2020 hingga 2023, aliran kas dari aktivitas operasional tetap positif dan konsisten. Pada tahun 2020, aliran kas operasional berada di sekitar 1 triliun IDR dan meningkat menjadi sekitar 1,1 triliun IDR pada tahun 2021, lalu menurun sedikit tetapi masih positif pada tahun 2022 dan 2023. Aliran kas positif dari operasional menunjukkan bahwa SIDO mampu menghasilkan cukup kas dari kegiatan inti bisnisnya untuk mendanai operasional sehari-hari.

  • Aliran kas dari aktivitas investasi cenderung negatif sepanjang periode 2020 hingga 2023. Aliran kas investasi menunjukkan pengeluaran yang relatif konstan, menunjukkan bahwa SIDO terus berinvestasi dalam aset tetap atau ekspansi bisnis lainnya. Aliran kas negatif dari aktivitas investasi menunjukkan bahwa perusahaan terus berinvestasi dalam pertumbuhan jangka panjangnya.

  • Aliran kas dari aktivitas pembiayaan juga menunjukkan pola negatif sepanjang periode 2020 hingga 2023. Pada tahun 2020, aliran kas dari aktivitas pembiayaan negatif sekitar 775 miliar IDR dan terus menunjukkan kenaikan tren negatif pada tahun-tahun berikutnya. Aliran kas negatif dari aktivitas pembiayaan menunjukkan bahwa SIDO mungkin telah membayar utang atau membayar dividen kepada pemegang saham.

Secara keseluruhan, grafik ini menunjukkan bahwa SIDO memiliki aliran kas yang sehat dari operasionalnya, berinvestasi untuk pertumbuhan masa depan, dan mengelola kewajiban atau mengembalikan nilai kepada pemegang sahamnya

Ratios¶

In [23]:
# Menghitung rasio profitabilitas Return on Equity (ROE)
ROE = ic_cleaned["Net Income"] / bs_cleaned["Total Equity Gross Minority Interest"] *100
ROE
Out[23]:
2023-12-31    28.076331
2022-12-31     31.51396
2021-12-31    36.324713
2020-12-31    28.991042
dtype: object
In [24]:
# Menghitung rasio profitabilitas Return on Assets (ROA)
ROA = ic_cleaned["Net Income"] / bs_cleaned["Total Assets"] *100
ROA
Out[24]:
2023-12-31    24.433817
2022-12-31    27.066757
2021-12-31    30.988137
2020-12-31    24.263206
dtype: object
In [25]:
# Visualisasi rasio profitabilitas ROE dan ROA
fig = go.Figure()

# Line chart ROE
cf1  = go.Scatter(
        x=bs_cleaned.index,
        y=ROE,
        name = 'Return on Equity (%)',
        hovertemplate = None
    )

# Line chart ROA
cf2  = go.Scatter(
        x=bs_cleaned.index,
        y=ROA,
        name = 'Return on Assets (%)',
        hovertemplate = None
    )

# Set data visualisasi rasio profitabilitas I
data_cf = [cf1, cf2]

# Update layout menambahkan judul
layout = go.Layout({
    'title': {
        'text': 'Profitability Ratios I',
        'font': {
            'size': 20
        },
        'x': 0.5,
        'xanchor': 'center'
    },
},
hovermode="x"
)

# Update axis
fig = go.Figure(data=data_cf, layout=layout)
fig.update_yaxes(title_text="(%)", hoverformat = ".2f")
fig.update_xaxes(
    tickmode='array',
    tickvals=[f'{year}-12-31' for year in range(2020, 2024)],
    ticktext=[str(year) for year in range(2020, 2024)]
)

Analysis dan Interpretasi

  • ROE meningkat tahun 2020 ke 2021 dari 28,9% ke 36,2%, mencapai puncak pada tahun 2021. Setelah tahun 2021, ROE menurun secara bertahap pada tahun 2022 dan terus menurun hingga tahun 2023 menjadi 28%.
  • Seperti halnya ROE, ROA meningkat tahun 2020 ke 2021 dari 24% ke 30,9%, mulai menurun pada tahun 2022 dan terus menurun pada tahun 2023 menjadi 24,4%.
  • Baik ROE maupun ROA mencapai puncaknya pada tahun 2021, yang menunjukkan bahwa tahun 2021 adalah tahun yang sangat menguntungkan bagi SIDO. Hal ini dapat disebabkan salah satunya oleh faktor eksternal yang menguntungkan bisnis perusahaan seperti tren meningkatnya kesadaran masyarakat untuk mengonsumsi produk kesehatan atau herbal di saat pandemi covid-19. Semua segmen penjualan SIDO mengalami kenaikan.
  • Penurunan ROE dan ROA setelah tahun 2021 menunjukkan adanya penurunan profitabilitas perusahaan karena beberapa faktor salah satunya normalisasi permintaan dari basis yang tinggi pada tahun sebelumnya karena penyebaran varian baru covid.

SIDO menunjukkan kinerja yang sangat baik pada tahun 2021 dengan peningkatan signifikan pada ROE dan ROA. Namun, profitabilitas perusahaan mengalami penurunan yang konsisten hingga tahun 2023 yang disebabkan oleh normalisasi permintaan, inflasi tinggi karena melemahnya daya beli konsumen, dan kenaikan harga bahan baku.

In [26]:
# Visualisasi Profitability Ratio II (Profit Margin)
fig = go.Figure()

# Bar chart Gross Profit Margin
cf1  = go.Bar(
        x=ic_convert.index,
        y=gpm,
        name = 'Gross Profit Margin (%)',
        hovertemplate = None
    )

# Bar chart Operating Profit Margin
cf2  = go.Bar(
        x=ic_convert.index,
        y=opm,
        name = 'Operating Profit Margin (%)',
        hovertemplate = None
    )

# Bar chart Net Profit Margin
cf3  = go.Bar(
        x=ic_convert.index,
        y=npm,
        name = 'Net Profit Margin (%)',
        hovertemplate = None
    )

# Set data visualisasi rasio profitabilitas (profit margin)
data_cf = [cf1, cf2, cf3]

# Update layout menambahkan judul
layout = go.Layout({
    'title': {
        'text': 'Profitability Ratios II<br>(Profit Margin)',
        'font': {
            'size': 18
        },
        'x': 0.5,
        'xanchor': 'center'
    },
},
hovermode="x unified"
)

# Update axis
fig = go.Figure(data=data_cf, layout=layout)
fig.update_yaxes(title_text="(%)", hoverformat = ".2f")
fig.update_xaxes(
    tickmode='array',
    tickvals=[f'{year}-12-31' for year in range(2020, 2024)],
    ticktext=[str(year) for year in range(2020, 2024)]
)

Analysis dan Interpretasi

  • Margin laba kotor (Gross Profit Margin) relatif konsisten dan tinggi di atas 50% untuk semua tahun (2020-2023). Gross Profit Margin yang konsisten menunjukkan bahwa perusahaan mampu menjaga biaya produksi tetap rendah relatif terhadap pendapatan. Ini menandakan efisiensi dalam produksi atau pengendalian biaya langsung.
  • Margin laba operasi (Operating Profit Margin) menunjukkan peningkatan dari tahun 2020 ke 2021, mencapai puncaknya pada tahun 2021. Kemudian terjadi penurunan dari tahun 2021 hingga 2023. Peningkatan Operating Profit Margin dari tahun 2020 ke 2021 menunjukkan peningkatan efisiensi operasional atau peningkatan pendapatan operasional. Penurunan setelah tahun 2021 menunjukkan peningkatan biaya operasi atau penurunan efisiensi operasional.
  • Net Profit Margin yang meningkat dari tahun 2020 ke 2021 menunjukkan peningkatan profitabilitas secara keseluruhan. Penurunan setelah tahun 2021 menunjukkan bahwa meskipun perusahaan mungkin masih efisien dalam produksi (dilihat dari Gross Profit Margin), biaya operasional dan biaya lain telah meningkat, mengurangi laba bersih.
  • Penurunan pada tahun 2022 karena normalisasi permintaan dari periode tahun sebelumnya yang tinggi, sedangkan penurunan pada tahun 2023 karena lemahnya daya beli konsumen karena lebih memprioritaskan belanja bahan pokok.

Secara keseluruhan, profit SIDO menunjukkan performa puncak dalam margin laba operasi dan laba bersih pada tahun 2021, namun mengalami penurunan setelah itu. Gross Profit Margin yang konsisten tinggi mengindikasikan bahwa perusahaan tetap efisien dalam produksi, tetapi peningkatan biaya operasional dan biaya lainnya telah mengurangi margin laba operasi dan laba bersih.

In [27]:
# Mengonversi dari satuan dasar ke miliar
liquidity = bs_transposed[["Current Assets", "Current Liabilities", "Cash And Cash Equivalents", "Inventory"]] / 1e9
liquidity
Out[27]:
Current Assets Current Liabilities Cash And Cash Equivalents Inventory
2023-12-31 2066.77 461.979 830.128 408.454
2022-12-31 2194.242 541.048 923.047 542.624
2021-12-31 2244.707 543.37 1082.219 454.81
2020-12-31 2052.081 560.043 1031.954 309.478
2019-12-31 NaN NaN NaN NaN
In [28]:
# Drop data kosong
liq_cleaned = liquidity.dropna(how='all')
liq_cleaned
Out[28]:
Current Assets Current Liabilities Cash And Cash Equivalents Inventory
2023-12-31 2066.77 461.979 830.128 408.454
2022-12-31 2194.242 541.048 923.047 542.624
2021-12-31 2244.707 543.37 1082.219 454.81
2020-12-31 2052.081 560.043 1031.954 309.478
In [29]:
# Menghitung Quick Ratio
qr = liq_cleaned["Current Assets"] - liq_cleaned["Inventory"]
quick_ratio = qr / liq_cleaned["Current Liabilities"]
quick_ratio
Out[29]:
2023-12-31    3.589592
2022-12-31    3.052627
2021-12-31    3.294067
2020-12-31    3.111552
dtype: object
In [30]:
# Menghitung Current Ratio
current_ratio = liq_cleaned["Current Assets"] / liq_cleaned["Current Liabilities"]
current_ratio
Out[30]:
2023-12-31    4.473731
2022-12-31     4.05554
2021-12-31    4.131084
2020-12-31    3.664149
dtype: object
In [31]:
# Menghitung Cash Ratio
cash_ratio = liq_cleaned["Cash And Cash Equivalents"] / liq_cleaned["Current Liabilities"]
cash_ratio
Out[31]:
2023-12-31    1.796896
2022-12-31    1.706035
2021-12-31     1.99168
2020-12-31    1.842634
dtype: object
In [32]:
# Visualisasi rasio likuiditas
fig = go.Figure()

# Bar chart Current Ratio
cf1  = go.Bar(
        x=bs_convert.index,
        y=current_ratio,
        name = 'Current Ratio',
        hovertemplate = None
    )

# Bar chart Quick Ratio
cf2  = go.Bar(
        x=bs_convert.index,
        y=quick_ratio,
        name = 'Quick Ratio',
        hovertemplate = None
    )

# Bar chart Cash Ratio
cf3  = go.Bar(
        x=bs_convert.index,
        y=cash_ratio,
        name = 'Cash Ratio',
        hovertemplate = None
    )

# Set data visualisasi rasio likuiditas
data_cf = [cf1, cf2, cf3]

# Update layout menambahkan judul
layout = go.Layout({
    'title': {
        'text': 'Liquidity Ratios',
        'font': {
            'size': 18
        },
        'x': 0.5,
        'xanchor': 'center'
    },
},
hovermode="x unified"
)

# Update axis
fig = go.Figure(data=data_cf, layout=layout)
fig.update_yaxes(title_text="Ratio Value", hoverformat = ".2f")
fig.update_xaxes(
    tickmode='array',
    tickvals=[f'{year}-12-31' for year in range(2020, 2024)],
    ticktext=[str(year) for year in range(2020, 2024)]
)

Analysis dan Interpretasi Rasio Likuiditas SIDO

  • Current Ratio tetap di atas 3 dari tahun 2020 hingga 2023, dengan puncak di sekitar 4,4 pada tahun 2023. Current Ratio yang tinggi menunjukkan bahwa perusahaan memiliki likuiditas yang baik dan mampu memenuhi kewajiban jangka pendeknya dengan mudah yang memberikan margin keamanan yang tinggi bagi kreditor. Peningkatan Current Ratio pada tahun 2021 mengindikasikan peningkatan signifikan dalam aset lancar dibandingkan kewajiban lancar.
  • Quick Ratio relatif stabil dikisaran 3 selama periode 2020 hingga 2023. Quick Ratio yang cukup tinggi (lebih dari 1) menunjukkan bahwa perusahaan juga dapat memenuhi kewajiban jangka pendeknya tanpa harus menjual persediaan. Quick Ratio yang konsisten lebih rendah dari Current Ratio menunjukkan bahwa sebagian aset lancar perusahaan terdiri dari persediaan.
  • Cash Ratio menunjukkan nilai yang lebih rendah dibandingkan dua rasio lainnya, berkisar antara 1,7 hingga 2. Cash Ratio yang lebih rendah tetapi tetap di atas 1 menunjukkan bahwa perusahaan memiliki cukup kas dan setara kas untuk menutupi kewajiban jangka pendeknya. Namun, rasio ini juga menunjukkan bahwa tidak semua aset lancar berada dalam bentuk yang sangat likuid. Cash Ratio juga menunjukkan peningkatan dari tahun 2020 ke 2021, tetapi stabil untuk tahun-tahun berikutnya. Stabilitas Cash Ratio setelah 2021 menunjukkan bahwa perusahaan menjaga tingkat kas dan setara kas yang cukup stabil.

Perusahaan SIDO memiliki likuiditas yang sangat baik selama periode 2020-2023, dengan rasio likuiditas yang menunjukkan kemampuan kuat untuk memenuhi kewajiban jangka pendek. Current Ratio yang sangat tinggi menunjukkan bahwa perusahaan memiliki lebih banyak aset lancar dibandingkan kewajiban lancarnya, sementara Quick Ratio yang cukup tinggi menunjukkan bahwa aset lancar yang tidak termasuk persediaan masih cukup untuk menutupi kewajiban jangka pendek. Cash Ratio yang stabil menunjukkan pengelolaan kas yang baik. Secara keseluruhan, SIDO berada dalam posisi likuiditas yang sangat baik selama periode 2020-2023.

In [33]:
# Visualisasi solvabilitas rasio DER dan DAR
fig = go.Figure()

# Line chart DER
cf1  = go.Scatter(
        x=bs_cleaned.index,
        y=DER,
        name = 'Debt on Equity Ratio (%)',
        hovertemplate = None
    )

# Line chart DAR
cf2  = go.Scatter(
        x=bs_cleaned.index,
        y=DAR,
        name = 'Debt on Assets Ratio (%)',
        hovertemplate = None
    )

# Set data visualisasi rasio solvabilitas
data_cf = [cf1, cf2]

# Update layout menambahkan judul
layout = go.Layout({
    'title': {
        'text': 'Solvency Ratios',
        'font': {
            'size': 20
        },
        'x': 0.5,
        'xanchor': 'center'
    },
},
hovermode="x"
)

# Update axis
fig = go.Figure(data=data_cf, layout=layout)
fig.update_yaxes(title_text="(%)", hoverformat = ".2f")
fig.update_xaxes(
    tickmode='array',
    tickvals=[f'{year}-12-31' for year in range(2020, 2024)],
    ticktext=[str(year) for year in range(2020, 2024)]
)

Analysis dan Interpretasi Rasio Solvensi SIDO

  • Pada tahun 2020, DER berada di sekitar 19% dan menunjukkan tren penurunan hingga mencapai sekitar 15% pada tahun 2023. Penurunan DER dari 2020 hingga 2023 menunjukkan bahwa SIDO secara konsisten mengurangi proporsi utang terhadap ekuitasnya, yang merupakan tanda positif dari peningkatan kesehatan finansial dan pengelolaan utang yang baik.

  • Pada tahun 2020, DAR berada di sekitar 16% dan menurun secara bertahap hingga sekitar 13% pada tahun 2023. Penurunan DAR menunjukkan bahwa SIDO mengurangi proporsi utangnya terhadap total asetnya, yang berarti perusahaan mengandalkan lebih banyak ekuitas daripada utang untuk mendanai operasional.

  • Penurunan yang konsisten DER dan DAR menunjukkan bahwa SIDO berhasil mengurangi ketergantungannya pada utang untuk mendanai operasional dan ekspansi bisnis. SIDO menunjukkan peningkatan kesehatan finansial dan kemampuan untuk memenuhi kewajiban jangka panjangnya.

Secara keseluruhan, penurunan DER dan DAR menunjukkan bahwa SIDO berada dalam posisi finansial yang lebih kuat dan lebih stabil dari tahun ke tahun, dengan pengelolaan utang yang baik.

In [34]:
# Mengonversi dari satuan dasar ke miliar
eff = ic_transposed[["Total Revenue", "Operating Revenue", "Cost Of Revenue"]] / 1e9
eff
Out[34]:
Total Revenue Operating Revenue Cost Of Revenue
2023-12-31 3565.93 3565.93 1547.235
2022-12-31 3865.523 3865.523 1696.832
2021-12-31 4020.98 4020.98 1734.948
2020-12-31 3335.411 3335.411 1496.628
2019-12-31 NaN NaN NaN
In [35]:
# Drop data kosong
eff_cleaned = eff.dropna(how='all')
eff_cleaned
Out[35]:
Total Revenue Operating Revenue Cost Of Revenue
2023-12-31 3565.93 3565.93 1547.235
2022-12-31 3865.523 3865.523 1696.832
2021-12-31 4020.98 4020.98 1734.948
2020-12-31 3335.411 3335.411 1496.628
In [36]:
# Mengonversi dari satuan dasar ke miliar
eff2 = bs_transposed[["Total Assets", "Accounts Receivable", "Inventory"]] / 1e9
eff2
Out[36]:
Total Assets Accounts Receivable Inventory
2023-12-31 3890.706 788.722 408.454
2022-12-31 4081.442 686.662 542.624
2021-12-31 4068.97 664.058 454.81
2020-12-31 3849.516 663.757 309.478
2019-12-31 NaN NaN NaN
In [37]:
# Menentukan nilai yang ingin diisi untuk tahun 2019
values_2019 = {
    "Total Assets": 352.955,
    "Accounts Receivable": 529.405,
    "Inventory": 299.244
}

# Mengisi nilai kosong di tahun 2019 dengan nilai yang ditentukan
eff2.loc[eff2.index == "2019-12-31", 'Total Assets'] = values_2019['Total Assets']
eff2.loc[eff2.index == "2019-12-31", 'Accounts Receivable'] = values_2019['Accounts Receivable']
eff2.loc[eff2.index == "2019-12-31", 'Inventory'] = values_2019['Inventory']
eff2
Out[37]:
Total Assets Accounts Receivable Inventory
2023-12-31 3890.706 788.722 408.454
2022-12-31 4081.442 686.662 542.624
2021-12-31 4068.97 664.058 454.81
2020-12-31 3849.516 663.757 309.478
2019-12-31 352.955 529.405 299.244
In [38]:
# Menggabungkan kedua dataframe berdasarkan indeks
combined = eff_cleaned.join(eff2, how='inner')

# Menghitung rasio Asset Turnover (Total Revenue terhadap Total Assets)
combined['Asset Turnover'] = combined['Total Revenue'] / combined['Total Assets']
# Menghitung rata-rata Accounts Receivable
combined['Average Accounts Receivable'] = (eff2['Accounts Receivable'] + eff2['Accounts Receivable'].shift(-1)) / 2
# Menghitung rata-rata Inventory
combined['Average Inventory'] = (eff2['Inventory'] + eff2['Inventory'].shift(-1)) / 2
# Menampilkan hasil join dengan perhitungan
combined
Out[38]:
Total Revenue Operating Revenue Cost Of Revenue Total Assets Accounts Receivable Inventory Asset Turnover Average Accounts Receivable Average Inventory
2023-12-31 3565.93 3565.93 1547.235 3890.706 788.722 408.454 0.916525 737.692 475.539
2022-12-31 3865.523 3865.523 1696.832 4081.442 686.662 542.624 0.947097 675.36 498.717
2021-12-31 4020.98 4020.98 1734.948 4068.97 664.058 454.81 0.988206 663.9075 382.144
2020-12-31 3335.411 3335.411 1496.628 3849.516 663.757 309.478 0.866449 596.581 304.361
In [39]:
# Menghitung Receivables Turnover
art = combined['Operating Revenue'] / combined['Average Accounts Receivable']
art
Out[39]:
2023-12-31    4.833901
2022-12-31    5.723648
2021-12-31    6.056536
2020-12-31    5.590877
Freq: -1A-DEC, dtype: object
In [40]:
# Menghitung Inventory Turnover
itr = combined['Cost Of Revenue'] / combined['Average Inventory']
itr
Out[40]:
2023-12-31    3.253645
2022-12-31    3.402395
2021-12-31    4.540037
2020-12-31    4.917279
Freq: -1A-DEC, dtype: object
In [41]:
# Visualisasi rasio efisiensi
fig = go.Figure()

# Bar chart Asset Turnover
cf1  = go.Bar(
        x=combined.index,
        y=combined['Asset Turnover'],
        name = 'Asset Turnover',
        hovertemplate = None
    )

# Bar chart Receivables Turnover
cf2  = go.Bar(
        x=combined.index,
        y=art,
        name = 'Receivables Turnover',
        hovertemplate = None
    )

# Bar chart Inventory Turnover
cf3  = go.Bar(
        x=combined.index,
        y=itr,
        name = 'Inventory Turnover',
        hovertemplate = None
    )

# Setd data visualisasi rasio efisiensi
data_cf = [cf1, cf2, cf3]

# Update layout menambahkan judul
layout = go.Layout({
    'title': {
        'text': 'Efficiency Ratios',
        'font': {
            'size': 18
        },
        'x': 0.5,
        'xanchor': 'center'
    },
},
hovermode="x unified"
)

# Update axis
fig = go.Figure(data=data_cf, layout=layout)
fig.update_yaxes(title_text="Ratio Value", hoverformat = ".2f")
fig.update_xaxes(
    tickmode='array',
    tickvals=[f'{year}-12-31' for year in range(2020, 2024)],
    ticktext=[str(year) for year in range(2020, 2024)]
)

Analysis dan Interpretasi Rasio Efisiensi SIDO

  • Rasio Asset Turnover tetap rendah dan stabil selama periode 2020 hingga 2023, berada di bawah 1. Hal ini menunjukkan bahwa perusahaan menghasilkan pendapatan yang relatif rendah dibandingkan dengan total aset yang dimilikinya.
  • Rasio Receivables Turnover cukup tinggi, sekitar 4 hingga 6, dengan puncak pada tahun 2021. Rasio Receivables Turnover yang tinggi menunjukkan bahwa perusahaan sangat efisien dalam mengelola piutang dan berhasil mengumpulkan pembayaran dari pelanggan dengan cepat.
  • Rasio Inventory Turnover juga cukup tinggi sekitar 4, dengan puncak pada tahun 2020. Setelah tahun 2020, rasio ini menurun secara bertahap hingga 2023. Rasio Inventory Turnover yang tinggi menunjukkan bahwa perusahaan mampu menjual dan mengganti persediaannya dengan cepat, yang merupakan indikator efisiensi operasional. Penurunan setelah tahun 2020 menunjukkan bahwa perusahaan mungkin mengalami penurunan penjualan atau peningkatan persediaan, yang dapat mengindikasikan masalah dalam pengelolaan persediaan atau penurunan permintaan produk.

Perusahaan SIDO menunjukkan efisiensi yang baik dalam mengelola piutang dan persediaannya, terutama pada tahun 2020 dan 2021. Namun, rasio Asset Turnover yang rendah menunjukkan bahwa ada potensi untuk meningkatkan efisiensi dalam penggunaan aset perusahaan. Penurunan rasio Receivables dan Inventory Turnover setelah puncaknya pada tahun 2021 menunjukkan perlunya peningkatan dalam pengelolaan piutang dan persediaan untuk mempertahankan efisiensi operasional yang tinggi. Secara keseluruhan, perusahaan perlu fokus pada peningkatan penggunaan aset untuk meningkatkan pendapatan dan mempertahankan efisiensi operasional.

Technical Analysis¶

In [42]:
# Load data history harga saham SIDO dengan tanggal yang sudah ditentukan
df = company.history(start="2019-01-01", end="2023-12-31")
In [43]:
# Menampilkan harga saham SIDO
df.tail()
Out[43]:
Open High Low Close Volume Dividends Stock Splits
Date
2023-12-21 00:00:00+07:00 530.985716 535.857145 516.371430 521.242859 18907700 0.0 0.0
2023-12-22 00:00:00+07:00 521.242890 530.985748 521.242890 526.114319 22292100 0.0 0.0
2023-12-27 00:00:00+07:00 526.114286 530.985714 511.500000 511.500000 31984800 0.0 0.0
2023-12-28 00:00:00+07:00 516.371460 521.242889 511.500031 516.371460 17058500 0.0 0.0
2023-12-29 00:00:00+07:00 516.371429 516.371429 506.628571 511.500000 35649900 0.0 0.0
In [44]:
# Visualisasi harga penutupan saham SIDO
fig = go.Figure()

close_price  = go.Scatter(
        x=df.index,
        y=df.Close,
        hovertemplate = None
    )

data = [close_price]

layout = go.Layout({
    'title': {
        'text': 'SIDO<br>Industri Jamu dan Farmasi Sido Muncul Tbk',
        'font': {
            'size': 18
        },
        'x': 0.5,
        'xanchor': 'center'
    },
},
hovermode="x"
)

fig = go.Figure(data=data, layout=layout)
fig.show()
In [45]:
# Visualisasi harga saham SIDO dengan candlestick
set_df = {
    'x': df.index,
    'open': df.Open,
    'close': df.Close,
    'high': df.High,
    'low': df.Low,
    'type': 'candlestick',
    'name': 'SIDO',
    'showlegend': True
}

# Set data visualisasi candlestick dan update layout
data = [set_df]
layout = go.Layout({
    'title': {
        'text': 'SIDO<br>Industri Jamu dan Farmasi Sido Muncul Tbk',
        'font': {
            'size': 18
        },
        'x': 0.5,
        'xanchor': 'center'
    }
})

# Menampilkan visualisasi
fig = go.Figure(data=data, layout=layout)
fig.show()
In [46]:
# Visualisasi harga dan volume saham SIDO dengan candlestick
fig = make_subplots(rows=2, cols=1, shared_xaxes=True, row_width=[0.30, 0.70])

# Candlestick harga saham SIDO
fig.add_trace(go.Candlestick(
    x=df.index,
    open=df['Open'],
    high=df['High'],
    low=df['Low'],
    close=df['Close'],
    showlegend=False
), row=1, col=1)

# Volume saham SIDO
fig.add_trace(go.Scatter(
    x=df.index,
    y=df.Volume,
    fill='tonexty',
    line_color='skyblue',
    showlegend=False,
), row=2, col=1)

# Update layout menambahkan judul
fig.update_layout(
    title=dict(
        text="SIDO<br>Industri Jamu dan Farmasi Sido Muncul Tbk",
        x=0.5,
        y=0.9,
        font=dict(size=18)
    )
)
In [47]:
# Distribusi harga saham SIDO
fig = px.histogram(df, x=df['Close'], nbins=50, histnorm='density', title='Distribusi Harga Saham SIDO')
fig.update_layout(
    title=dict(
        text="Distribusi Harga Saham SIDO",
        x=0.5,
        y=0.9,
        font=dict(size=18)
    )
)
In [48]:
# Copy data
df2 = df.copy()
In [49]:
# Menghitung Daily returns
daily_return = df2[['Close']]
daily_change = daily_return.pct_change() #pt-pt1/pt1
In [50]:
# Visualisasi daily return
fig = px.line(daily_change, x=daily_change.index, y=daily_change.Close, markers=True, title='Daily Return')

# Update layout
fig.update_traces(line_dash='dash', marker=dict(symbol='circle'))
fig.update_layout(
    title=dict(
        text="Daily Return",
        x=0.5,
        y=0.9,
        font=dict(size=18)
    ),
    xaxis_title='Date',
    legend_title='Legends'
)

# Menampilkan grafik
fig.update_yaxes(title_text="Change", hoverformat = ".3f")
In [51]:
# Distribusi daily return
df2['Daily Return'] = daily_change
fig = px.histogram(df, x=df2['Daily Return'].dropna(), nbins=100, title='Daily Return')
fig.update_layout(
    title=dict(
        text="Distribusi Daily Return",
        x=0.5,
        y=0.9,
        font=dict(size=18)
    )
)

Moving Average (MA) dan Moving Average Convergence Divergence (MACD)¶

  • Moving average digunakan untuk menghaluskan fluktuasi harga dan menunjukkan tren jangka panjang atau pendek.
  • Moving Average Convergence Divergence (MACD) adalah indikator momentum yang digunakan untuk mengidentifikasi perubahan arah tren, kekuatan, momentum, dan durasi dari suatu tren harga pasar.
In [52]:
# Moving Average 50 hari dan 200 hari
df2['MA_50'] = df2['Close'].rolling(window=50).mean()
df2['MA_200'] = df2['Close'].rolling(window=200).mean()
In [53]:
# Visualisasi Moving Average
fig = go.Figure()

# Line chart harga saham
ma_close  = go.Scatter(
        x=df2.index,
        y=df2.Close,
        name = 'Close Price',
        hovertemplate = None
    )

# Line chart MA 50 hari
ma50  = go.Scatter(
        x=df2.index,
        y=df2['MA_50'],
        name = 'MA 50 Days',
        hovertemplate = None
    )

# Line chart MA 200 hari
ma200  = go.Scatter(
        x=df2.index,
        y=df2['MA_200'],
        name = 'MA 200 Days',
        hovertemplate = None
    )

# Set data visualisasi MA
data_ma = [ma_close, ma50, ma200]

# Update layout
layout = go.Layout({
    'title': {
        'text': 'Moving Average SIDO',
        'font': {
            'size': 18
        },
        'x': 0.5,
        'xanchor': 'center'
    },
},
hovermode="x unified", plot_bgcolor='rgba(37,37,37,1)'
)

# Menampilkan grafik
fig = go.Figure(data=data_ma, layout=layout)
fig.show()

Analisis dan Interpretasi Moving Average SIDO

  • Secara umum, dari Januari 2019 hingga sekitar pertengahan 2022, ada tren peningkatan harga. Setelah itu, harga menunjukkan tren penurunan yang cukup tajam hingga Juli 2023.
  • Moving Average 50 hari lebih reaktif terhadap perubahan harga terbaru dibandingkan MA 200 hari. Ketika MA 50 hari berada di atas MA 200 hari, ini menunjukkan kondisi bullish (pasar naik) jangka pendek. Sebaliknya, ketika berada di bawah MA 200 hari, ini menunjukkan kondisi bearish (pasar turun) jangka pendek.
  • Moving Average 200 hari menunjukkan tren jangka panjang. Saat garis ini terus meningkat, tren jangka panjang dianggap bullish. Ketika garis ini mulai menurun, ini menunjukkan bahwa tren jangka panjang bisa menjadi bearish.
  • Menuju Juli 2023, MA 50 dan MA 200 hari menunjukkan tren penurunan yang kuat dan MA 50 hari tetap di bawah MA 200 hari, menunjukkan bearish market yang terus menerus.
In [54]:
# Visualisasi Moving Averange dengan Candlestcik

# Candlestick MA 50 hari
cdl_ma50 = {
    'x': df2.index,
    'y': df2['MA_50'],
    'type': 'scatter',
    'mode': 'lines',
    'line': {
        'width': 1,
        'color': 'lime'
            },
    'name': 'Moving Average 50 hari'
}

# Candlestick MA 200
cdl_ma200 = {
    'x': df2.index,
    'y': df2['MA_200'],
    'type': 'scatter',
    'mode': 'lines',
    'line': {
        'width': 1,
        'color': 'yellow'
            },
    'name': 'Moving Average 200 hari'
}

# Set data visualisasi MA dengan candlestick
dataMA = [set_df, cdl_ma50, cdl_ma200]

# Update layout
layout = go.Layout({
    'title': {
        'text': 'Moving Averange SIDO',
        'font': {
            'size': 25
        },
        'x': 0.5,
        'xanchor': 'center'
    },
}, plot_bgcolor='rgba(37,37,37,1)')

# Menampilkan grafik
fig = go.Figure(data=dataMA, layout=layout)
fig.show()

Analisis dan Interpretasi Moving Average SIDO

  • Golden Cross terjadi ketika MA 50 hari melintasi MA 200 hari dari bawah ke atas, yang bisa dianggap sebagai sinyal bullish. Hal ini terlihat terjadi beberapa kali, misalnya awal tahun 2021.

  • Death Cross terjadi ketika MA 50 hari melintasi MA 200 hari dari atas ke bawah, yang bisa dianggap sebagai sinyal bearish. Hal ini terlihat terjadi pada pertengahan tahun 2022.

  • Perbedaan antara harga penutupan dan moving average, serta seberapa sering garis-garis ini saling silang, menunjukkan tingkat volatilitas. Perioda dengan volatilitas tinggi biasanya ditandai dengan lebih seringnya garis-garis ini bersilangan dan deviasi yang lebih besar dari MA.

In [55]:
# Indikator Moving Average Convergence Divergence
EMA_12 = pd.Series(df2['Close'].ewm(span=12, min_periods=12).mean())
EMA_26 = pd.Series(df2['Close'].ewm(span=26, min_periods=26).mean())
MACD = pd.Series(EMA_12 - EMA_26)
MACD_signal = pd.Series(MACD.ewm(span=9, min_periods=9).mean())

# Chart EMA 12 hari dan 26 hari, serta chart MACD
fig = make_subplots(rows=2, cols=1)
fig.add_trace(go.Scatter(x=df2.index, y=df2.Close, name='Close'), row=1, col=1)
fig.add_trace(go.Scatter(x=df2.index, y=EMA_12, name='EMA 12'), row=1, col=1)
fig.add_trace(go.Scatter(x=df2.index, y=EMA_26, name='EMA 26'), row=1, col=1)
fig.add_trace(go.Scatter(x=df2.index, y=MACD, name='MACD'), row=2, col=1)
fig.add_trace(go.Scatter(x=df2.index, y=MACD_signal, name='Signal line'), row=2, col=1)

# Update layout
fig.update_layout(
    title=dict(
        text="Moving Average Convergence Divergence",
        x=0.5,
        y=0.9,
        font=dict(size=18)
    ),
    plot_bgcolor='rgba(37,37,37,1)',
    hovermode='x'
)

# Menampilkan grafik
fig.show()

Analisis dan Interpretasi MACD SIDO

  • Bullish Crossover: Terjadi ketika garis MACD memotong dan bergerak di atas garis signal, menunjukkan potensi awal tren naik. Ini terlihat di beberapa titik, misalnya awal tahun 2019 dan pertengahan 2020.
  • Bearish Crossover: Terjadi ketika garis MACD memotong dan bergerak di bawah garis signal, menunjukkan potensi awal tren turun. Contohnya adalah awal tahun 2023.
  • Ketika garis MACD berada di atas zero line, kondisi umum pasar lebih bullish. Ketika garis MACD berada di bawah zero line, kondisi umum pasar lebih bearish. Gerakan di atas atau di bawah garis nol ini juga membantu menilai kekuatan tren. Misalnya, gerakan yang lebih dalam di bawah garis nol di awal 2023 menunjukkan tren turun yang kuat.

Pergerakan garis MACD relatif terhadap zero line dan signal line dapat menunjukkan apakah momentum pasar sedang meningkat atau menurun di kedua arah tren. Fluktuasi tajam pada garis MACD dan frekuensi cross-overs menunjukkan periode volatilitas tinggi.

Bollinger Bands¶

Bollinger Bands berguna untuk mengukur volatilitas serta potensi titik balik pasar.

In [56]:
# Bollinger Bands
df2['STD_50'] = df2['Close'].rolling(window=50).std()

# Menghitung upper dan lower band
upper_bb = df2['MA_50'] + (df2['STD_50'] * 2)
lower_bb = df2['MA_50'] - (df2['STD_50'] * 2)
In [57]:
# Visualisasi Bollinger Bands
fig = go.Figure()

# Line chart Upper Bollinger Bands
upBB  = go.Scatter(
        x=df2.index,
        y=upper_bb,
        name = 'Upper BB',
        hovertemplate = None
    )

# Line chart Lower Bollinger Bands
lowBB  = go.Scatter(
        x=df2.index,
        y=lower_bb,
        name = 'Lower BB',
        hovertemplate = None
    )

# Set data visualisasi Bollinger Bands
data_bb = [ma_close, upBB, ma50, lowBB]

# Update layout
layout = go.Layout({
    'title': {
        'text': 'Bollinger Bands',
        'font': {
            'size': 25
        },
        'x': 0.5,
        'xanchor': 'center'
    },
}, hovermode="x unified", plot_bgcolor='rgba(37,37,37,1)'
)

# Menampilkan grafik
fig = go.Figure(data=data_bb, layout=layout)
fig.show()

Analisis dan Interpretasi Bollinger Bands SIDO

  • Lebar bands mencerminkan volatilitas aset. Ketika bands melebar, volatilitas meningkat, dan ketika bands menyempit, volatilitas menurun.
  • Harga yang sering berinteraksi dengan upper atau lower band bisa memberikan sinyal. Mencapai Upper Band sering kali diinterpretasikan sebagai pasar yang 'overbought' atau harga yang tinggi yang mungkin menghadapi tekanan jual. Mencapai Lower Band sering kali diinterpretasikan sebagai pasar yang 'oversold' atau harga yang rendah yang mungkin menarik pembeli.
  • Ketika harga bergerak di atas MA 50 hari, ini biasanya dianggap sebagai indikasi tren naik. Sebaliknya, jika di bawah MA 50 hari biasanya dianggap sebagai indikasi tren turun.
  • Periode di mana bands sangat menyempit (squeeze), sering kali mengindikasikan kemungkinan pergerakan harga yang signifikan ke atas atau ke bawah dalam waktu dekat.
In [58]:
# Visualisasi Bollinger Bands dengan Candlestcik

# Line chart Upper Bollinger Bands
bb_up = {
    'x': df2.index,
    'y': upper_bb,
    'type': 'scatter',
    'mode': 'lines',
    'line': {
        'width': 1,
        'color': 'dodgerblue'
            },
    'name': 'UPPER BB'
}

# Line chart Lower Bollinger Bands
bb_low = {
    'x': df2.index,
    'y': lower_bb,
    'type': 'scatter',
    'mode': 'lines',
    'line': {
        'width': 1,
        'color': 'yellow'
            },
    'name': 'LOWER BB'
}

# Set data visualisasi candlestick Bollinger Bands
dataBB = [set_df, bb_up, cdl_ma50 , bb_low]

#  Update layout
layout = go.Layout({
    'title': {
        'text': 'Bollinger Bands',
        'font': {
            'size': 25
        },
        'x': 0.5,
        'xanchor': 'center'
    },
}, plot_bgcolor='rgba(37,37,37,1)')

# Menampilkan grafik
fig = go.Figure(data=dataBB, layout=layout)
fig.show()

Analisis dan Interpretasi Bollinger Bands SIDO

  • Tahun 2019 hingga 2020, terdapat tren naik dengan harga yang sering berada di atas MA dan sering menyentuh upper band.
  • Tahun 2021 hingga 2022, volatilitas meningkat dengan harga yang sering menyentuh kedua bands, mencerminkan fluktuasi harga yang lebih besar.
  • Tahun 2023, terlihat tren menurun dengan harga yang sering berada di bawah MA dan sering menyentuh lower band.

Menuju pertengahan 2023, harga sering menyentuh lower band dan berada di bawah MA 50 hari, mengindikasikan kondisi bearish dengan potensi stabilisasi atau bahkan penurunan lebih lanjut.

Relative Strength Index (RSI)¶

RSI adalah indikator momentum yang digunakan dalam analisis teknikal untuk mengukur kecepatan dan perubahan pergerakan harga.

In [59]:
# Fungsi menghitung RSI periode 14 hari
def rsi(close, periods = 14):

     # Menghitung perubahan harga
    close_delta = close.diff()

    # Memisahkan perubahan harga menjadi nilai positif dan negatif
    up = close_delta.clip(lower=0)
    down = -1 * close_delta.clip(upper=0)

    # Menghitung EMA dari perubahan positif dan negatif
    ma_up = up.ewm(com = periods - 1, adjust=True, min_periods = periods).mean()
    ma_down = down.ewm(com = periods - 1, adjust=True, min_periods = periods).mean()

    # Menghitung RSI dari MA
    rsi = ma_up / ma_down
    rsi = 100 - (100/(1 + rsi))
    return rsi
In [60]:
# Menghitung RSI
df2['RSI'] = rsi(df2['Close'])

# Visualisasi harga saham SIDO dan RSI
fig = make_subplots(rows=2, cols=1, shared_xaxes=True, row_width=[0.40, 0.60])

# Line chart harga saham SIDO
fig.add_trace(
    go.Scatter(x=df2.index,
        y=df2['Close'],
        name = 'Close Price',
        fill='tonexty',
        hovertemplate = None
    ), row=1, col=1)

# Line chart RSI
fig.add_trace(
    go.Scatter(x=df2.index,
        y=df2['RSI'],
        name = 'RSI',
        line=dict(color="green"),
        hovertemplate = None
    ), row=2, col=1)

# Menambahkan garis upper/lower bounds
fig.update_yaxes(range=[-10, 110], row=2, col=1)
fig.add_hline(y=0, col=1, row=2, line_color="#666", line_width=2)
fig.add_hline(y=100, col=1, row=2, line_color="#666", line_width=2)

# Menambahkan garis/dash overbought (>70) dan oversold (<30)
fig.add_hline(y=30, col=1, row=2, line_color='#336699', line_width=2, line_dash='dash')
fig.add_hline(y=70, col=1, row=2, line_color='#336699', line_width=2, line_dash='dash')

# Update layout
fig.update_layout(
    title=dict(
        text="Relative Strength Index",
        x=0.5,
        y=0.9,
        font=dict(size=18)
    ),
    hovermode="x"
)

Analisis dan Interpretasi RSI SIDO

  • Ketika RSI berada di atas 70 (overbought), ini menunjukkan bahwa saham mungkin telah mencapai kondisi jenuh beli, di mana harga telah naik cukup tinggi dan mungkin ada potensi koreksi atau penurunan.
  • Ketika RSI berada di bawah 30 (oversold), ini menunjukkan bahwa saham mungkin telah mencapai kondisi jenuh jual, di mana harga telah turun cukup jauh dan mungkin ada potensi pembalikan naik.
  • Pergerakan RSI ini dapat digunakan untuk mengidentifikasi titik masuk dan keluar dari saham berdasarkan level overbought dan oversold.
  • Dalam konteks jangka panjang, pergerakan RSI yang sering berada di antara level 30 hingga 70 menunjukkan adanya volatilitas dalam harga saham, tetapi tidak ada tren yang sangat dominan dalam jangka panjang.
In [61]:
# Visualisasi RSI
fig = make_subplots()

# Line chart RSI
fig.add_trace(
    go.Scatter(x=df2.index,
        y=df2['RSI'],
        name = 'RSI',
        line=dict(color="blue"),
        hovertemplate = None
    ))

# Menambahkan garis upper/lower bounds
fig.update_yaxes(range=[-10, 110], hoverformat = ".2f")
fig.add_hline(y=0, line_color="black", line_width=2)
fig.add_hline(y=100, line_color="black", line_width=2)

# Menambahkan garis/dash overbought (>70) dan oversold (<30)
fig.add_hline(y=30, line_color='red', line_width=2, line_dash='dash')
fig.add_hline(y=70, line_color='red', line_width=2, line_dash='dash')

# Update layout
fig.update_layout(
    title=dict(
        text="Relative Strength Index",
        x=0.5,
        y=0.9,
        font=dict(size=18)
    ),
    hovermode="x",
    yaxis_title='RSI'
)

Analisis dan Interpretasi RSI SIDO

  • RSI berfluktuasi di antara level 20 dan 80, dengan beberapa kali menyentuh atau mendekati garis overbought (70) dan oversold (30).
  • Tahun 2020-2021, RSI sering mendekati atau melewati level 70, menunjukkan adanya periode bullish yang kuat. Hal ini bisa mencerminkan kinerja harga saham yang naik selama periode tersebut.
  • Tahun 2022-2023, terlihat lebih banyak pergerakan antara level 30 hingga 70, dengan beberapa kali RSI jatuh di bawah 30, menunjukkan beberapa periode bearish atau koreksi harga.

Tidak ada tren yang jelas dominan dalam jangka panjang, yang menunjukkan bahwa harga saham mungkin berfluktuasi dalam rentang yang lebih luas, dengan momentum bullish dan bearish yang bergantian.

Stochastic¶

In [62]:
# Tentukan periode
k_period = 14
d_period = 3

# Menambahkan kolom "n_high" dengan nilai maksimum dari 14 periode sebelumnya
n_high = df2['High'].rolling(k_period).max()

# Menambahkan kolom "n_low" dengan nilai minimum dari 14 periode sebelumnya
n_low = df2['Low'].rolling(k_period).min()
In [63]:
# Menggunakan nilai min/max untuk menghitung %k
df2['%K'] = (df2['Close'] - n_low) * 100 / (n_high - n_low)

# Menggunakan %k untuk menghitung SMA dari 3 nilai terakhir dari %k
df2['%D'] = df2['%K'].rolling(d_period).mean()
In [64]:
# Import library pandas_ta
import pandas_ta as ta

# Menambahkan beberapa parameter
df2.ta.stoch(high='high', low='low', k=14, d=3, append=True)
Out[64]:
STOCHk_14_3_3 STOCHd_14_3_3
Date
2019-01-18 00:00:00+07:00 NaN NaN
2019-01-21 00:00:00+07:00 NaN NaN
2019-01-22 00:00:00+07:00 2.777759 NaN
2019-01-23 00:00:00+07:00 2.777759 NaN
2019-01-24 00:00:00+07:00 21.618294 9.057937
... ... ...
2023-12-21 00:00:00+07:00 62.025336 64.838282
2023-12-22 00:00:00+07:00 49.252036 59.174042
2023-12-27 00:00:00+07:00 31.607208 47.628193
2023-12-28 00:00:00+07:00 21.818188 34.225811
2023-12-29 00:00:00+07:00 13.400665 22.275354

1219 rows × 2 columns

In [65]:
# Visualisasi indikator Stochastic
fig = make_subplots(rows=2, cols=1, shared_xaxes=True)

# Line chart harga saham SIDO
fig.add_trace(
    go.Scatter(x=df2.index,
        y=df2['Close'],
        name = 'Close Price',
        fill='tonexty',
        hovertemplate = None
    ), row=1, col=1)

# Line chart K Stochastic
fig.add_trace(
    go.Scatter(x=df2.index,
        y=df2['STOCHk_14_3_3'],
        name = 'K Stochastic',
        line=dict(color="lime"),
        hovertemplate = None
    ), row=2, col=1)

# Line chart D Stochastic
fig.add_trace(
    go.Scatter(x=df2.index,
        y=df2['STOCHd_14_3_3'],
        name = 'D Stochastic',
        line=dict(color="orange"),
        hovertemplate = None
    ), row=2, col=1)

# Menambahkan garis upper/lower bounds
fig.update_yaxes(range=[-10, 110], row=2, col=1, hoverformat = ".2f")
fig.add_hline(y=0, col=1, row=2, line_color="#666", line_width=2)
fig.add_hline(y=100, col=1, row=2, line_color="#666", line_width=2)

# Menambahkan garis/dash overbought (>80) dan oversold (<20)
fig.add_hline(y=20, col=1, row=2, line_color='#336699', line_width=2, line_dash='dash')
fig.add_hline(y=80, col=1, row=2, line_color='#336699', line_width=2, line_dash='dash')

# Update layout
fig.update_layout(
    title=dict(
        text="Stochastic Indicator",
        x=0.5,
        y=0.9,
        font=dict(size=18)
    ),
    hovermode="x",
    plot_bgcolor='rgba(37,37,37,1)'
)

Analisis dan Interpretasi Indikator Stochastic SIDO

  • Periode Overbought, terdapat beberapa momen ketika %K dan %D Stochastic berada di atas 80, terutama saat harga saham mencapai puncaknya di sekitar tahun 2021. Ini bisa menandakan momen ketika saham berada dalam kondisi jenuh beli, dengan potensi koreksi.
  • Periode Oversold, di beberapa titik terutama setelah penurunan harga saham pada tahun 2022 dan 2023, Stochastic sering berada di bawah 20. Ini menunjukkan bahwa saham berada dalam kondisi jenuh jual, dengan potensi pembalikan harga.
  • Sinyal Beli dapat diidentifikasi ketika %K memotong %D dari bawah di area oversold (di bawah 20), yang mengindikasikan potensi kenaikan harga. Sinyal Jual dapat diidentifikasi ketika %K memotong %D dari atas di area overbought (di atas 80), yang mengindikasikan potensi penurunan harga.

Indikator Stochastic menunjukkan bahwa saham SIDO sering kali mengalami fase overbought dan oversold dalam beberapa tahun terakhir. Ini memberikan peluang bagi trader untuk melakukan aksi beli di area oversold dan aksi jual di area overbought.

Namun, seperti dengan indikator sebelumnya, penting untuk menggunakan indikator ini bersama dengan analisis teknikal lainnya untuk membuat keputusan investasi yang lebih baik.

In [ ]: